/**
 * @Author: Sagan
 * @Date: 2020/09/16 14:53
 */
package module

import (
	"gitee.com/big_meteor/godash/validate/constant"
	"reflect"
)

// 是否不为零值
// 支持的类型：string、float、int、uint
func Require(v interface{}, params ...string) (bool, error) {
	if 0 < len(params) && "zero" == params[0] {
		return true, nil
	}

	rt := reflect.TypeOf(v)
	if nil == rt {
		return false, nil
	}

	rv := reflect.ValueOf(v)
	if reflect.Ptr == rv.Kind() {
		if rv.IsNil() {
			return false, nil
		}

		rv = rv.Elem()
	}
	if rv.IsZero() {
		return false, nil
	}

	switch rv.Kind() {
	case reflect.Bool, reflect.Map, reflect.Chan, reflect.Slice, reflect.Array:
		return true, nil
	case reflect.String:
		return 0 < rv.Len(), nil
	case reflect.Float32, reflect.Float64:
		return 0 != rv.Float(), nil
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
		return 0 != rv.Int(), nil
	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
		return 0 != rv.Uint(), nil
	}

	return false, constant.ERROR_REQUIRE_UDT
}
